package org.atlantis.datasink.event;

import java.util.Collection;

import org.atlantis.datasink.Nameable;

/**
 * 事件队列，用于处理异步事件。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">李曦</a><br/>
 *         Created at: 2012-5-22 下午9:05:06
 */
public interface EventQueue extends Nameable {

	/**
	 * 将消息添加到事件队列中
	 * 
	 * @param message
	 * @return false表示添加失败（失败原因：队列没有足够的资源来处理该消息或队列已被销毁），true则表示添加成功
	 */
	boolean offer(Object message);

	/**
	 * 当前事件队列中正在处理的消息数量
	 * 
	 * @return
	 */
	int size();

	/**
	 * 添加事件监听器
	 * 
	 * @param handler
	 * @return false表示添加失败（失败原因：该监听器已经存在或队列已被销毁），true则表示添加成功
	 */
	boolean addHandler(EventHandler handler);

	/**
	 * 移除事件监听器
	 * 
	 * @param handler
	 * @return false表示移除失败（失败原因：该监听器不存在或队列已被销毁），true则表示移除成功
	 */
	boolean removeHandler(EventHandler handler);

	/**
	 * 获取监听该队列的所有事件监听器
	 * 
	 * @return
	 */
	Collection<EventHandler> getHandlers();

	/**
	 * 停止事件队列
	 * 
	 * @return 还未来得及处理的消息
	 */
	Collection<Object> stop();

	/**
	 * 是否正在运行。
	 * 
	 * @return
	 */
	boolean isAlive();
}
